package com.ht.api.bean;

import java.util.ArrayList;
import java.util.List;

import com.ht.api.db.Db;
import com.ht.api.db.DbList;
import com.ht.api.db.Entity;

import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import lombok.Data;

/**
 * 登陆用户信息
 * @author asq
 * @createTime 2024年12月22日 15:38:27
 */
@Data
public class UserInfo {
	/** 所属租户ID */
	private long tenantId;
	/** 用户ID */
	private long id;
	/** 是否是管理员 */
	private boolean admin;
	/** 密码 */
	private String password;
	/** 登陆唯一ID */
	private String uuid;
	/** 账户状态 */
	private Integer status;
	/** 有权限的菜单权限字符串列表 */
	private List<String> perms;
	/** 租户数据源配置 */
	private JSONObject tenantConfig;
	
	public UserInfo() {
		super();
	}

	/**
	 * 注入登陆用户
	 * @param u 用户
	 * @param uuid 登陆唯一id:
	 * @param channel 登陆渠道
	 */
	public UserInfo(Entity u, String uuid) {
		this.tenantId = u.getLong("tenant_id");
		this.id = u.getLong("main_id");
		this.status = u.getInt("status");
		this.admin = u.getBool("admin");
		this.password = u.getStr("password");
		this.uuid = uuid;
		
		// 加载菜单的权限字符串
		this.perms = loadMenus();
		
		// 查询租户数据源配置
		this.tenantConfig = loadTenantConfig(tenantId);
	}

	/**
	 * 返回本对象的json串
	 * @return
	 */
	public String toJson() {
		return JSONUtil.toJsonStr(this);
	}
	
	/**
	 * 加载当前用户有权限的菜单列表
	 * @return
	 */
	private List<String> loadMenus() {
		if (!admin) {
			StringBuilder sb = new StringBuilder();
			sb.append("select perms from sys_menu where sys_deleted=1 and main_id in(");
			sb.append("  select menu_id from sys_role_menu where sys_deleted=1 and role_id in(");
			sb.append("    select role_id from sys_user_role where sys_deleted=1 and user_id=?");
			sb.append("  )");
			sb.append(")");
			DbList dbList = Db.query(sb.toString(), this.id);
			return dbList.stream().map(p -> p.getStr("perms")).toList();
		} else {
			return new ArrayList<>();
		}
	}

	/**
	 * 租户数据源配置
	 * @param tenantId 租户ID
	 * @return
	 */
	private JSONObject loadTenantConfig(long tenantId) {
		if (tenantId != 0) {
			String config = Db.createSqlParser("sys_tenant").where("main_id", tenantId).select("config").val();
			return JSONUtil.parseObj(config);
		} else {
			return JSONUtil.createObj();
		}
	}
}
